/*----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the 
License at http://www.mozilla.org/MPL/
	
Software distributed under the License is distributed on 
an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, 
either express or implied. 
See the License for the specific language governing rights and 
limitations under the License.
	
The Original Code is Fever RS ( ActionScript 3 ) Framework code.
	
The Initial Developer of the Original Code is Romain Ecarnot.
Portions created by Initial Developer are Copyright (C) 2006
the Initial Developer. All Rights Reserved.
	
Contributor(s):
	
Unless required by applicable law or agreed to in writing, 
software distributed under the License is distributed on 
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied.
See the License for the specific language governing permissions 
and limitations under the License.
----------------------------------------------------------------------------*/

package fever.data.formatters
{
	import fever.error.AbstractConstructorAccessException;
	import fever.error.UnimplementedOverridingException;
	import fever.utils.Stringifier;	

	/**
	 * Abstract class defines basic formatting rules for concrete 
	 * formatter classes.
	 * 
	 * @author Romain Ecarnot
	 */
	public class Formatter 
	{
		//--------------------------------------------------------------------
		// Public properties
		//--------------------------------------------------------------------
		
		/** Error message (if any). */
		public var error : String;
		
		/**
		 * Formats passed-in <code>value</code> and returns formatting 
		 * string result.
		 * 
		 * @throws fever.error.UnimplementedOverridingException if method is not overrided 
		 * by concrete subclasses.
		 */
		public function format( value : * ) : String
		{
			throw new UnimplementedOverridingException( "format() must be override" );
			return value;
		}
		
		/**
		 * Returns string representation.
		 */
		public function toString() : String
		{
			return Stringifier.parse( this );
		}
		
		
		//--------------------------------------------------------------------
		// Internal implementations
		//--------------------------------------------------------------------
		
		/**
		 * Allows <strong>Formatter</strong> extension.<br />
		 * Pass <code>getConstructorAccess()</code> as parameter when calling 
		 * super constructor.
		 * 
		 * @example
		 * <listing version=3.0>
		 * 
		 * package
		 * {
		 * 	class MyFormatter extends Formatter
		 * 	{
		 * 		public function MyFormatter( )
		 * 		{
		 * 			super( getContructorAccess() );
		 * 		}
		 * 	}
		 * } 
		 * </listing>
		 */
		protected final function getConstructorAccess() : AbstractAccess
		{ 
			return new AbstractAccess(); 
		}
		
		//--------------------------------------------------------------------
		// Private implementations
		//--------------------------------------------------------------------
		
		/**
		 * @private
		 * Private constructor.
		 */
		public function Formatter( access : AbstractAccess )
		{
			if( access == null )
			{
				throw new AbstractConstructorAccessException( this );	
			}
			else
			{
				error = "";
			}
		}
	}
}

internal class AbstractAccess{}